package com.bstech.Tabelle;

import java.io.StringWriter;
import java.util.List;
import java.util.Vector;

import org.acra.ErrorReporter;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xmlpull.v1.XmlSerializer;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

import com.bstech.Classi.Common;
import com.bstech.Utils.XmlParser;

public class RapportiniTecnici {
	public static String TABLE_NAME = "RAPPORTINI_TECNICI";

	public static String ID_KEY = "ID";
	public static String ID_RAPPORTINO_KEY = "ID_RAPPORTINO";
	public static String ID_TECNICO_KEY = "ID_TECNICO";
	public static String STATO_KEY = "STATO";
	public static String MODIFICATO_KEY = "MODIFICATO";
	
	public static int STATO_ASSEGNATO = 0;
	public static int STATO_RIMOSSO = 1;

	public static String CREATE_TABLE_QUERY = "CREATE TABLE IF NOT EXISTS "+ TABLE_NAME +"(" +
												ID_KEY+" integer primary key not null," +
												ID_RAPPORTINO_KEY+" integer not null," +
												ID_TECNICO_KEY+" integer not null," +
												STATO_KEY+" integer not null," +
												MODIFICATO_KEY+" integer not null);";
	
	public static void UpdateToVersion(SQLiteDatabase db, int from, int to )
	{
		for(int ver = from +1; ver<= to; ver++)
		{
//			switch(ver)
//			{
//			case 2:
//				db.executeSql("");
//				break;
//			case 3:
//				db.executeSql("");
//				break;
//			}
		}
	}
	public static boolean Insert(int ID, int IdRapportino, int IdTecnico, int Stato, boolean Modificato)
	{
		ContentValues cv = new ContentValues();
		
		cv.put(RapportiniTecnici.ID_KEY, ID);
		cv.put(RapportiniTecnici.ID_RAPPORTINO_KEY, IdRapportino);
		cv.put(RapportiniTecnici.ID_TECNICO_KEY, IdTecnico);
		cv.put(RapportiniTecnici.STATO_KEY, Stato);
		cv.put(RapportiniTecnici.MODIFICATO_KEY, Modificato ? -1 : 0);
		
		return Common.db.Insert(RapportiniTecnici.TABLE_NAME, null, cv);
	}
	public static boolean Update(int ID, int IdRapportino, int IdTecnico, int Stato, boolean modificato)
	{
		ContentValues cv = new ContentValues();
		
		cv.put(RapportiniTecnici.ID_RAPPORTINO_KEY, IdRapportino);
		cv.put(RapportiniTecnici.ID_TECNICO_KEY, IdTecnico);
		cv.put(RapportiniTecnici.STATO_KEY, Stato);
		cv.put(RapportiniTecnici.MODIFICATO_KEY, modificato ? -1 : 0);
		
		return Common.db.Update(RapportiniTecnici.TABLE_NAME, cv, RapportiniTecnici.ID_KEY + " = " + Integer.toString(ID), null);
	}
	public static boolean UpdateStato(int ID, int Stato)
	{
		ContentValues cv = new ContentValues();
		
		cv.put(RapportiniTecnici.STATO_KEY, Stato);
		cv.put(RapportiniTecnici.MODIFICATO_KEY, -1);
		
		return Common.db.Update(RapportiniTecnici.TABLE_NAME, cv, RapportiniTecnici.ID_KEY + " = " + Integer.toString(ID), null);
	}

	public static List<RapportinoTecnici> SelectAll(int idRapportino)
	{
		Cursor cursor = Common.db.query(RapportiniTecnici.TABLE_NAME, new String[] {RapportiniTecnici.ID_KEY,RapportiniTecnici.ID_RAPPORTINO_KEY,RapportiniTecnici.ID_TECNICO_KEY,RapportiniTecnici.STATO_KEY},
						RapportiniTecnici.ID_RAPPORTINO_KEY + "=" + Integer.toString(idRapportino) +" AND " + STATO_KEY + " = " + Integer.toString(STATO_ASSEGNATO),
						null, null,null, 
						RapportiniTecnici.ID_TECNICO_KEY);
		
		List<RapportinoTecnici> ret = new Vector<RapportinoTecnici>();
		
		if(cursor != null)
		{
			while(cursor.moveToNext())
				ret.add(Select(cursor));
			cursor.close();
		}
		
		return ret;
	}
	public static List<RapportinoTecnici> SelectAllModificati(int idRapportino)
	{
		Cursor cursor = Common.db.query(RapportiniTecnici.TABLE_NAME, new String[] {RapportiniTecnici.ID_KEY,RapportiniTecnici.ID_RAPPORTINO_KEY,RapportiniTecnici.ID_TECNICO_KEY,RapportiniTecnici.STATO_KEY},
				RapportiniTecnici.ID_RAPPORTINO_KEY + "=" + Integer.toString(idRapportino) +" AND " + RapportiniTecnici.MODIFICATO_KEY + "<> 0",null, null,null,RapportiniTecnici.ID_TECNICO_KEY);
		
		List<RapportinoTecnici> ret = new Vector<RapportinoTecnici>();
		
		if(cursor != null)
		{
			while(cursor.moveToNext())
				ret.add(Select(cursor));
			cursor.close();
		}
		
		return ret;
	}
	public static boolean AssignedTo(int idRapportino,int idTecnico)
	{
		Cursor cursor = Common.db.query(RapportiniTecnici.TABLE_NAME, new String[] {RapportiniTecnici.ID_KEY},
				RapportiniTecnici.ID_RAPPORTINO_KEY + "=" + Integer.toString(idRapportino) +" AND " + RapportiniTecnici.ID_TECNICO_KEY + " = " + Integer.toString(idTecnico),
				null, null,null,null);

		if(cursor != null && cursor.moveToFirst())
		{
			cursor.close();
			return true;
		}
		else
			return false;
	}
	public static boolean Exists(int idRappTecnico) {
		Cursor cursor = Common.db.query(RapportiniTecnici.TABLE_NAME,new String[] { RapportiniTecnici.ID_KEY }, RapportiniTecnici.ID_KEY + "=" + Integer.toString(idRappTecnico), null, null, null, null);

		int count = 0;
		if (cursor != null) {
			count = cursor.getCount();
			cursor.close();
		}
		return (count > 0);
	}
	private static RapportinoTecnici Select(Cursor cursor)
	{
		RapportinoTecnici ret = null;
		
		if(cursor != null && !cursor.isAfterLast())
		{	
			ret = new RapportinoTecnici();
			
			ret.ID = cursor.getInt(0);
			ret.idRapportino = cursor.getInt(1);
			ret.IdTecnico = cursor.getInt(2);
			ret.Stato = cursor.getInt(3);
		}
		return ret;
	}
	public static void Storicizza()
	{
		Common.db.executeSql("DELETE FROM "+ RapportiniTecnici.TABLE_NAME +" WHERE "+ RapportiniTecnici.MODIFICATO_KEY +" = 0");
	}
	
	public static class RapportinoTecnici
	{
		public RapportinoTecnici(){}
		public int ID,idRapportino,IdTecnico,Stato;
		
		public static String GetXml(RapportinoTecnici item)
		{
			String ret = null;
			
			XmlSerializer serializer = XmlParser.CreateSerializer();
	        StringWriter writer = new StringWriter();
	        
	        try {
	                serializer.setOutput(writer);
	                serializer.startDocument("UTF-8", true);
	                //serializer.startTag("", "RAPPORTINI_TECNICI");
	                
//	                if(lista != null && lista.size() > 0)
//		    			for(RapportinoTecnici item : lista)
//		    			{
    				serializer.startTag("", "RAPPORTINI_TECNICO");
    				XmlParser.addTagAndValue(serializer, "ID",Integer.toString(item.ID));
    				XmlParser.addTagAndValue(serializer, "AS05_RAPPORTINO_AS02",Integer.toString(item.idRapportino));
    				XmlParser.addTagAndValue(serializer, "AS05_TECNICO_TC01",Integer.toString(item.IdTecnico));
    				serializer.endTag("", "RAPPORTINI_TECNICO");
//		    			}

//	                serializer.endTag("", "RAPPORTINI_TECNICI");
	                serializer.endDocument();
	                ret = writer.toString();
	                
	                writer.close();
	                writer = null;
	                serializer = null;
	        } catch (Exception e) {
	        	Log.e("Rapportino.GetXml", "Errore durante la creazione di un nodo. Errore: " + e.toString());
				ErrorReporter.getInstance().handleException(e);
	        }
			
	        return ret;
		}
		public static List<RapportinoTecnici> GetFromXml(String xml)
		{
			List<RapportinoTecnici> ret = new Vector<RapportinoTecnici>();
			
			if(xml !=null)
			{
				NodeList nodi = XmlParser.ParseNodes(xml, "RAPPORTINI_TECNICO");
				if(nodi !=null)
				{
					int nodesCount = nodi.getLength();
					RapportinoTecnici r = null;
					
					for(int i=0; i < nodesCount; i++)
					{
						r = ParseFromXmlNode(nodi.item(i));
						if(r != null)
							ret.add(r);
					}
					
					r = null;
					nodi = null;
				}
				else
					Log.e("RapportinoTecnici.GetFromXml", "Errore durante il parse dei nodi, ritornato null");
			}
			else
				Log.e("RapportinoTecnici.GetFromXml", "Parametro xml nullo");
			
			return ret;
		}
		private static RapportinoTecnici ParseFromXmlNode(Node nodo) {
			RapportinoTecnici ret = new RapportinoTecnici();
			
			NodeList dettagli = nodo.getChildNodes();
			int detailsCount = dettagli.getLength();
			
			Element dettaglio = null;
			String nome = "";
			String valore = "";
			
			for(int i=0;i<detailsCount;i++)
			{
				try {
					if(dettagli.item(i).getNodeType() == Node.ELEMENT_NODE)
					{
						dettaglio = (Element)dettagli.item(i);
						nome = dettaglio.getNodeName();
						valore = dettaglio.getTextContent();
						
						if(nome.equals("ID"))
							ret.ID = Integer.parseInt(valore.trim());
						else if(nome.equals("AS05_RAPPORTINO_AS02"))
							ret.idRapportino = Integer.parseInt(valore.trim());
						else if(nome.equals("AS05_TECNICO_TC01"))
							ret.IdTecnico = Integer.parseInt(valore.trim());
						
					}
				} catch (Exception e) {
					Log.e("RapportinoTecnici.ParseFromXmlNode", "Errore nel ciclo di assegnazione valori. Errore: " + e.toString());
					ret = null;
					break;
				}
			}
			
			dettaglio = null;
			dettagli = null;
			
			return ret;
		}
		public boolean ImpostaModificato(boolean stato)
		{
			try {
				
				ContentValues cv = new ContentValues();
				cv.put(RapportiniTecnici.MODIFICATO_KEY, stato ? -1 : 0);
				Log.v("Update flag MODIFICATO RapportiniTecnici", "IDRapportinoTecnico: " + Integer.toString(ID));
				return Common.db.Update(RapportiniTecnici.TABLE_NAME, cv, RapportiniTecnici.ID_KEY + " = " + Integer.toString(ID), null);
			} catch (Exception e) {
				return false;
			}
		}
		public boolean AggiornaID(int nuovoID)
		{
			try {
				Log.v("Update ID Rapportino Tecnico", "IDRapportinoTecnico: " + Integer.toString(ID));
				
				ContentValues cv = new ContentValues();
				cv.put(RapportiniTecnici.ID_KEY, nuovoID);
				Common.db.Update(RapportiniTecnici.TABLE_NAME, cv, RapportiniTecnici.ID_KEY + " = " + Integer.toString(ID), null);
				return true;
			} catch (Exception e) {
				return false;
			}
		}
		public void AggiornaIDRapportino(int nuovoID)
		{
			//aggiorno id su record chiamata
			Log.v("Update ID Rapportino Tecnico", "IDRapportinoTecnico: " + Integer.toString(ID));
			
			ContentValues cv = new ContentValues();
			cv.put(RapportiniTecnici.ID_RAPPORTINO_KEY, nuovoID);
			Common.db.Update(RapportiniTecnici.TABLE_NAME, cv, RapportiniTecnici.ID_KEY + " = " + Integer.toString(ID), null);
		}
	}
}